package cn.tedu.v1.v4;

/**
 * 多线程并发安全问题：
 * 当多个线程并发操作同一个资源时候，由于线程切换时机不确定
 * 可能导致代码执行混乱，而且还有可能出现程序错误，严重软件瘫痪【卡死】
 *
 * 客户端   多线程并发 X    服务器  多线程并发  ✓
 *
 * synchronized   关键字  ---多线程并发    同步锁
 *
 * 使用方法①：同步块方式   最常用
 *        ②：同步方法：一个线程执行完毕后，再执行下一个
 * 定义语法：
 *   synchronized(同步监视器对象){
 *       需要同步运行的代码块
 *   }
 *  案例：去厕所 问题
 */
public class Thread_syn {
    public static void main(String[] args) {
        //创建厕所类
        WC wc=new WC();
        //创建第一个人--线程
        Thread p1=new Thread(()->{
            wc.door();  //去厕所功能
        });
        Thread p2=new Thread(()->{
            wc.door();  //去厕所功能
        });
        p1.start();
        p2.start();

    }
}
//创建厕所类
class WC {
    public void door() {  //去厕所
        //线程实例--记录线程信息
        Thread s = Thread.currentThread();
        System.out.println(s.getName() + "去厕所....");
        try {
            //同心锁：门加一把锁
            synchronized (this) {
                Thread.sleep(5000);
                System.out.println(s.getName() + "找门进去，，，");
            }
            Thread.sleep(300000);
            System.out.println(s.getName() + "穿裤子走人，，，");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}